package com.yourenbang.lingyun.transaction.mapper;

import com.yourenbang.lingyun.transaction.web.domain.dto.TradeListDTO;
import com.yourenbang.lingyun.transaction.web.domain.dto.manage.ManageTradeAmountDTO;
import com.yourenbang.lingyun.transaction.web.domain.dto.manage.TradeManageDTO;
import com.yourenbang.lingyun.transaction.web.domain.dto.manage.TradeManageDetailDTO;
import com.yourenbang.lingyun.transaction.web.domain.vo.PayTransactionVO;
import com.yourenbang.lingyun.transaction.web.domain.vo.TradeDetailVO;
import com.yourenbang.lingyun.transaction.web.domain.vo.manage.ManageTradeVO;
import com.yourenbang.lingyun.transaction.web.domain.vo.pay.UserDaySumVO;
import com.yourenbang.transaction.api.model.dto.fund.*;
import com.yourenbang.transaction.api.model.dto.pay.QueryTradeCountDTO;
import com.yourenbang.transaction.api.model.dto.pay.TradeCountDTO;
import com.yourenbang.transaction.api.model.vo.pay.*;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

public interface TransactionPayTransactionMapper {

    /**
     * 插入
     */
    int insert(@Param("index")int index, @Param("tran") PayTransaction tran);

    /**
     * 根据id更新(乐观锁)
     */
    int updateByIdWithVersion(@Param("index")int index, @Param("tran") PayTransaction tran);

    /**
     * 根据id更新(无乐观锁)
     */
    int updateByIdNoVersion(@Param("index")int index, @Param("tran") PayTransaction tran);

    /**
     * 根据orderNo更新
     */
    int updateByOrderNo(@Param("index")int index, @Param("tran") PayTransaction tran);

    /**
     * 通过订单号获取交易订单
     */
    PayTransaction getByOrderNo(@Param("index")int index, @Param("orderNo") String orderNo);

    /**
     * 通过系统参考号获取交易订单
     */
    PayTransaction getBySysRef(@Param("index")int index, @Param("sysRef") String sysRef, @Param("merchantNo") String merchantNo, @Param("channelId") Short channelId, @Param("platNo") Short platNo);


    /**
     * 查询交易详情列表
     */
    List<TradeDetailVO> queryTradeList(@Param("dto") TradeListDTO dto, @Param("index") int index);

    /**
     * 银小云查询交易详情列表
     */
    List<TradeDetailVO> queryTradeListYxy(@Param("dto") TradeListDTO dto, @Param("index") int index);

    /**
     * 查询交易月交易额
     */
    BigDecimal queryMonthAmount(@Param("dto") QueryMonthAmountDTO dto, @Param("index") int index);

    /**
     * 银小云查询交易月交易额
     */
    BigDecimal queryMonthAmountYxy (@Param("dto") QueryMonthAmountDTO dto, @Param("index") int index);
    /**
     * 查询多个月交易额
     */
    List<MonthAmountVO> queryMonthsAmountContainPledge(@Param("dto") QueryMonthListAmountDTO dto, @Param("index") int index);

    /**
     * 查单个用户当月交易额
     * @param dto
     * @param index
     * @return
     */
    BigDecimal queryCurrentMonthAmountContainPledge(@Param("dto") QueryMonthListAmountDTO dto, @Param("index") int index);

    /**
     * 查询总交易额
     */
    BigDecimal queryTotalAmount(@Param("dto") QueryUserTotalAmountDTO dto, @Param("index") int index);

    /**
     * 子表查询计入分润交易额包含押金
     */
    BigDecimal queryTotalAmountContainPledge(@Param("dto") QueryUserTotalAmountDTO dto, @Param("index") int index);

    /**
     * 查询多个用户当月总交易额
     * @param dto
     * @return
     */
//    List<UsersAmountVO> queryUsersCurrentMonthTotalAmount(@Param("dto") QueryUsersCurrentMonthTotalAmountDTO dto);

    /**
     * 电签实时达标金额
     */
    BigDecimal eposReachAmt(@Param("userId") String userId, @Param("beginDate") LocalDate beginDate, @Param("endDate") LocalDate endDate, @Param("index") int index);

    /**
     * 银小云查询交易额
     */
    BigDecimal yxyEposReachAmtByChannelId(@Param("userId") String userId,
                            @Param("beginDate") LocalDate beginDate,
                            @Param("endDate") LocalDate endDate,
                            @Param("index") int index,
                            @Param("channelId") Short channelId);
    /**
     * 银小云查询交易额 包含押金
     */
    BigDecimal yxyEposReachAmtByChannelIdIncluePledge(@Param("userId") String userId,
                            @Param("beginDate") LocalDate beginDate,
                            @Param("endDate") LocalDate endDate,
                            @Param("index") int index,
                            @Param("channelId") Short channelId);

    /**
     * 银小云查询押金
     */
    BigDecimal yxyEposPledgeAmtByChannelId(@Param("userId") String userId,
                            @Param("beginDate") LocalDate beginDate,
                            @Param("endDate") LocalDate endDate,
                            @Param("index") int index,
                            @Param("channelId") Short channelId);

    /**
     * 银小云查询押金交易
     */
    PayTransaction selectYxyPledgeAmount(@Param("userBaseId") String userBaseId,
                            @Param("index") int index,
                            @Param("channelId") Short channelId);

    /**
     * 银小云查询P42押金交易
     */
    PayTransaction selectYxyP42PledgePayTransaction(@Param("userBaseId") String userBaseId, @Param("index") int index);



    /**
     * 查询押金
     */
    BigDecimal eposPledgeAmtByChannelId(@Param("userId") String userId,
                            @Param("beginDate") LocalDate beginDate,
                            @Param("endDate") LocalDate endDate,
                            @Param("index") int index,
                            @Param("channelId") Short channelId);
    /**
     * 银小云查询p42交易额
     */
    BigDecimal yxyP42ActiveAmtByChannelId(@Param("userId") String userId,
                            @Param("beginDate") LocalDate beginDate,
                            @Param("endDate") LocalDate endDate,
                            @Param("index") int index,
                            @Param("channelId") Short channelId);

    /**
     * 电签P30实时达标金额
     */
    BigDecimal eposP30ReachAmt(@Param("userId") String userId, @Param("beginDate") LocalDate beginDate, @Param("endDate") LocalDate endDate, @Param("index") int index);

    /**
     * 电签P30实时达标金额
     */
    BigDecimal eposP30ReachAmtNo38(@Param("userId") String userId, @Param("beginDate") LocalDate beginDate, @Param("endDate") LocalDate endDate, @Param("index") int index);

    /**
     * 电签P20违激活金额
     */
    BigDecimal eposActivateAmt(@Param("userId") String userId, @Param("beginDate") LocalDate beginDate, @Param("endDate") LocalDate endDate, @Param("index") int index);

    int batchInsert(@Param("index")int index, @Param("trans") List<PayTransaction> trans);

    /**
     * 好拓客实时达标金额
     */
    BigDecimal htkReachAmt(@Param("userBaseId") String userBaseId, @Param("beginDate") LocalDate beginDate, @Param("endDate") LocalDate endDate, @Param("index") int index);

    /**
     * 好拓客激活金额
     */
    BigDecimal htkActivateAmt(@Param("userBaseId") String userBaseId, @Param("beginDate") LocalDate beginDate, @Param("endDate") LocalDate endDate, @Param("index") int index);

    /**
     * 管理后台交易列表
     * @param index
     * @param dto
     * @return
     */
    List<ManageTradeVO> queryMangeTradeList(@Param("index")int index, @Param("dto") TradeManageDTO dto);

    /**
     * 机构后台交易列表 查询pay_transaction_index表
     * @param dto 查询条件
     * @return pay_transaction_index中的交易信息
     */
    List<ManageTradeVO> queryMangeClientTradeList(@Param("dto") TradeManageDTO dto);

    /**
     * 机构后台交易统计
     * @param dto 查询条件
     */
    List<ManageTradeAmountDTO> queryMangeClientTradeStatistics(@Param("dto") TradeManageDTO dto);

    /**
     * 获取交易明细
     * @param dto 查询条件
     * @param index 表下标
     * @return 交易明细列表
     */
    List<PayTransaction> queryPayTransactionList(@Param("dto") TradeManageDTO dto, @Param("index") int index);

    PayTransactionVO queryMangeTradeDetail(@Param("index")int index, @Param("dto") TradeManageDetailDTO dto);

    /**
     * 获取电签交易额(含扫码)
     */
    BigDecimal sumEposByUserId(@Param("index")int index, @Param("userBaseId") String userBaseId, @Param("transactionDay") String transactionDay);

    /**
     * 获取电签交易额(不含扫码)
     */
    BigDecimal sumEposByUserIdNo38(@Param("index")int index, @Param("userBaseId") String userBaseId, @Param("transactionDay") String transactionDay);

    /**
     * 用户是否有电签交易
     */
    int countByUserEpos(@Param("index")int index, @Param("userBaseId") String userBaseId);

    /**
     * M40交易笔数 查询盟友下交易笔数最高的机具
     * @param index 子表索引
     * @param dto 商户id,盟友id
     * @return 交易笔数,机具号
     */
    TradeCountVO countTradeM40ByAlly(@Param("index")int index, @Param("dto") TradeCountDTO dto);

    /**
     * M40交易笔数 按机具号查询
     * @param index 子表索引
     * @param dto 机具号
     * @return 交易笔数,机具号
     */
    TradeCountVO countTradeM40ByTerminalSn(@Param("index")int index, @Param("dto") TradeCountDTO dto);

    /**
     * M40优惠消费金额
     * @param index
     * @param dto
     * @return
     */
    BigDecimal yxyAmtM40(@Param("index")int index,@Param("dto") TradeCountDTO dto);

    /**
     * M40所有消费金额
     * @param index
     * @param dto
     * @return
     */
    BigDecimal yxyAmtM40All(@Param("index")int index,@Param("dto") TradeCountDTO dto);

    /**
     * 所有卡类型的交易额 (目前m40使用)
     * @param index
     * @param dto
     * @return
     */
    BigDecimal yxyAmtAllCard(@Param("index")int index,@Param("dto") TradeCountDTO dto);

    /**
     * 查询交易笔数
     * @param index
     * @param dto
     * @return
     */
    Integer transactionCount(@Param("index")int index,@Param("dto") QueryTradeCountDTO dto);

    /**
     * 查询交易笔数 -M40
     * @param index
     * @param dto
     * @return
     */
    Integer transactionCountM40(@Param("index")int index,@Param("dto") QueryTradeCountDTO dto);

    /**
     * 通过渠道和时间查询有成功交易的用户
     * @param beginTime 开始时间
     * @param endTime 结束时间
     * @param channelId 渠道
     * @return 用户ID集合
     */
    List<String> getPayUserByChannelAndTime(@Param("beginTime") String beginTime,
                                            @Param("endTime") String endTime,
                                            @Param("userBaseId") String userBaseId,
                                            @Param("channelId") Short channelId);

    /**
     * 查询用户某日交易合计
     * @param index 分表编号
     * @param userBaseId 用户ID
     * @param beginTime 开始时间
     * @param endTime 结束时间
     * @param channelId 渠道
     * @return 交易合计列表
     */
    List<UserDaySumVO> getUserDaySumByTime(@Param("index") int index,
                                           @Param("userBaseId") String userBaseId,
                                           @Param("beginTime") String beginTime,
                                           @Param("endTime") String endTime,
                                           @Param("channelId") Short channelId);


    /**
     * 查询商户是否有交易 返回第一笔交易的ID
     */
    Integer existTransactionByMerchant(@Param("index")int index, @Param("merchantNo") String merchantNo);

    /**
     * 查询商户的机具是否有交易 返回第一笔交易的ID
     */
    Integer existTransactionByMerchantAndTerminalSn(@Param("index")int index, @Param("merchantNo") String merchantNo, @Param("terminalSn") String terminalSn);
    /**
     * 查询用户是否有交易 返回第一笔交易的ID
     */
    Integer existTransactionByUserBaseId(@Param("index")int index, @Param("userBaseId") String userBaseId, @Param("sn") String sn);

    /**
     * 通过机具归属 用户查询多个月交易额 适用多机具商户
     */
    List<MonthAmountVO> queryMonthsAmountBySns(@Param("dto") QueryMonthListAmountByAllyDTO dto, @Param("index") int index);

    /**
     * 通过机具归属 用户查询所有交易额 适用多机具商户
     * @param dto 查询条件
     * @param index 子表下标
     * @return 交易额
     */
    BigDecimal queryUserAmountBySns(@Param("dto") QueryUserTotalAmountByAllyDTO dto, @Param("index") int index);

    /**
     * 通过用户ID和渠道ID获取 该商户所有的机具号
     * @param userBaseId 用户ID
     * @param channelId 渠道ID
     * @param index 下标
     * @return 机具列表
     */
    List<String> getTerminalSnByUserBaseIdAndChannelId(@Param("userBaseId") String userBaseId,
                                                       @Param("channelId") Short channelId,
                                                       @Param("platNo") Short platNo,
                                                       @Param("index") int index);

    /**
     * 获取商户最近一次分润的交易
     * @param index 下标
     * @param merchantNo 商户号
     * @return 交易信息
     */
    DyPayTransactionPO getMerchantLastProfitTransaction(@Param("index") int index,
                                                        @Param("merchantNo") String merchantNo,
                                                        @Param("profitFlag") String profitFlag);

    /**
     * 查询商户分润交易额
     * @param index 下标
     * @param merchantNo 商户号
     * @param month 月份，如果为空查全部
     * @return 查询结果 商户号 交易额
     */
    ProfitTransactionAmountVO getMerchantProfitTransactionAmount(@Param("index") int index,
                                                                 @Param("merchantNo") String merchantNo,
                                                                 @Param("month") String month);

    BigDecimal discountTradeAmt(@Param("userBaseId") String userBaseId, @Param("index") int transTableIndex, @Param("channelId") Short channelId);
    /**
     * 通过商户号和交易时间获取交易订单
     */
    List<PayTransaction> getByMerchantNoTransTime(@Param("index")int index, @Param("merchantNo") String merchantNo,
                                                  @Param("transactionTime") String transactionTime, @Param("limit") Integer limit );
}